// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraButtonBase.h"
#include "CommonActionWidget.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraButtonBase)

/**
 * 在构造之前进行本地初始化
 * 更新按钮样式和刷新按钮文本
 */
void ULyraButtonBase::NativePreConstruct()
{
	// 调用父类实现
	Super::NativePreConstruct();

	// 更新按钮样式
	UpdateButtonStyle();
	// 刷新按钮文本
	RefreshButtonText();
}

/**
 * 更新输入动作控件
 * 同时更新按钮样式和刷新按钮文本
 */
void ULyraButtonBase::UpdateInputActionWidget()
{
	// 调用父类实现
	Super::UpdateInputActionWidget();

	// 更新按钮样式
	UpdateButtonStyle();
	// 刷新按钮文本
	RefreshButtonText();
}

/**
 * 设置按钮文本
 * @param InText 要设置的新文本
 */
void ULyraButtonBase::SetButtonText(const FText& InText)
{
	// 根据输入文本是否为空来设置覆盖标志
	bOverride_ButtonText = InText.IsEmpty();
	// 设置按钮文本
	ButtonText = InText;
	// 刷新按钮文本显示
	RefreshButtonText();
}

/**
 * 刷新按钮文本显示
 * 如果设置了覆盖文本或按钮文本为空，则尝试使用输入动作控件的显示文本
 */
void ULyraButtonBase::RefreshButtonText()
{
	// 如果设置了覆盖文本或者按钮文本为空
	if (bOverride_ButtonText || ButtonText.IsEmpty())
	{
		// 如果存在输入动作控件
		if (InputActionWidget)
		{
			// 获取输入动作控件的显示文本
			const FText ActionDisplayText = InputActionWidget->GetDisplayText();	
			// 如果显示文本不为空
			if (!ActionDisplayText.IsEmpty())
			{
				// 使用输入动作的显示文本更新按钮
				UpdateButtonText(ActionDisplayText);
				// 返回
				return;
			}
		}
	}
	
	// 使用自身的按钮文本更新按钮
	UpdateButtonText(ButtonText);	
}

/**
 * 当输入方法改变时调用
 * @param CurrentInputType 当前的输入类型
 */
void ULyraButtonBase::OnInputMethodChanged(ECommonInputType CurrentInputType)
{
	// 调用父类实现
	Super::OnInputMethodChanged(CurrentInputType);

	// 更新按钮样式以适应新的输入方法
	UpdateButtonStyle();
}